package com.erp.erp_dao.Billing;

import com.erp.erp_entitys.Billing.entity.BillingEntity;
import com.erp.erp_entitys.Billing.req.*;
import com.erp.erp_entitys.Billing.vo.*;
import com.erp.erp_entitys.Cost.vo.NameAndCodeVO;
import com.erp.erp_entitys.Cost.vo.QueryImportContractVO;
import org.apache.ibatis.annotations.Param;

import java.time.LocalDate;
import java.util.List;

/**
 * @author zjk
 * @version 1.0
 * @description
 * @date 2021/1/16/016 3:56
 */
public interface BillingDao {
    int deleteByPrimaryKey(Integer id);

    int insert(BillingEntity record);

    /**
     * 根据id查询开票实体
     * @param id
     * @return
     */
    BillingEntity selectByid(Integer id);

    /**
     * 修改开票主信息
     * @param record
     * @return
     */
    Integer updateBillingEntityByCode(BillingEntity record);

    int updateByPrimaryKey(BillingEntity record);


    /**
     * 添加开票主信息
     * @param record
     * @return
     */
    Integer insertBillingEntity(BillingEntity record);
    /**
     * 根据开票编号查询开票信息
     * @param code
     * @return
     */
    BillingEntity selectBillingByCode(String code);

    /**
     * 根据当天时间，查询开票编号总数量
     * @param createDate  开票创建时间
     * @return
     */
    List<String> selectCodeByCode(@Param("createDate") LocalDate createDate);

    /**
     * 根据条件查询报关信息
     * 在代码里处理未开票数量=产品总数量-开票数量
     * @param req
     * @return
     */
    List<QueryBillDeclareVO> selectBillDeclareByPage(QueryBillDeclareReq req);

    /**
     * 根据条件查询报关信息
     * @param req
     * @return
     */
    List<QueryBillDeclareVO2> selectBillDeclare2ByPage(QueryBillDeclareReq req);
    /**
     * 根据报关主表id查询报关明细信息,根据厂商和报关发票号码分组
     * @param declareId 报关主表id
     * @return
     */
    List<QueryBillDeclareDetailVO> selectBillDeclareProductByDeclareId(@Param("declareId") Integer declareId,
                                                                       @Param("manufacturerName") String manufacturerName);

    /**
     * 根据采购主表ID查询采购产品信息
     * @param purchaseId
     * @return
     */
    List<QueryPurchaseProductVO> selectPurchaseProductByPurchaseId(@Param("purchaseId") Integer purchaseId);
    /**
     * 根据外销主表ID查询外销产品信息
     * @param exportId
     * @return
     */
    List<QueryExportProductVO> selectExportProductByPurchaseId(@Param("exportId") Integer exportId);

    /**
     * 根据报关主表id查询报关发票号
     * @param declareId 报关主表id
     * @return
     */
    String selectBillDeclareProductCodeByDeclareId(@Param("declareId") Integer declareId);
    /**
     * 根据条件查询出 报关 已开票数量
     * @param manufacturerName 供应商名称
     * @param invoiceCode 报关发票号
     * @param stockNo 采购单号
     * @param productCode 产品编码
     * @param specCode 规格编码
     * @return
     */
    Integer selectInvoicedQuantity(@Param("manufacturerName") String manufacturerName,
                                   @Param("invoiceCode") String invoiceCode,
                                   @Param("stockNo") String stockNo,
                                   @Param("productCode") String  productCode,
                                   @Param("specCode") String  specCode);

    /**
     * 查询所有供应商
     * @return
     */
    List<CompanyVO> findAllCustomer2();

    /**
     * 查询所有签约公司(开票抬头)
     * @return
     */
    List<CompanyVO> findAllCompany();
    /**
     * 根据签约公司编号查询银行名称集合
     * @return
     */
    List<String> getBankName(@Param("code") String code);

    //*************************************************************************************


    /**
     * 根据条件查询开票信息集合
     * @param req
     * @return
     */
    List<QueryBillingVO> findBillingList(QueryBillingReq req);

    /**
     * 修改开票状态为无效
     * @param costIds
     * @return
     */
    int updateBillingValidById(@Param("ids") Integer[] ids);

    /**
     * 更新开票状态
     * @param id 开票id
     * @param status    开票状态
     * @return
     */
    int updateBillingStatusById(@Param("id") Integer id,@Param("status") Integer status);

    /**
     * 开票统计--供应商
     * @param req
     * @return
     */
    List<billingStatistics1VO> billingStatistics1List(billingStatistics1Req req);
    /**
     * 采购开票统计-分页
     * @param req
     * @return
     */
    List<BillingPurchaseStatisticsRes> billingPurchaseStatisticsList(BillingPurchaseStatisticsReq req);


    /**
     * 开票统计--客户票--外销
     * @param req
     * @return
     */
    List<billingStatistics1VO> billingStatistics2List(billingStatistics1Req req);
    /**
     * 开票统计--客户票--结汇
     * @param req
     * @return
     */
    List<billingStatistics1VO> billingStatistics22List(billingStatistics1Req req);
    /**
     * 根据签约公司获取银行名称-开票用，
     * @param companyCode
     * @return
     */
    String getBankNameByCompanyCode(String companyCode);


    /**
     * 获取外销合同-单据得价格术语默认国内贸易
     * @param req
     * @return
     */
    List<QueryImportContractVO> getExportContentList(QueryImportExportContractReq req);


    /**
     * 获取价格术语，只包含国内的--开票用
     * @return
     */
    List<NameAndCodeVO> getPriceTerms();


    /**
     * 开票-导入采购合同
     * @param req
     * @return
     */
    List<QueryPurchaseContractVO> getPurchaseContractList(QueryPurchaseContractReq req);

    /**
     * 开票导入出运明细
     * 获取出运明细产品和配件信息
     */
    List<QueryImportCarrDetailProductRes> findCarryDetailProductList(QueryImportCarrDetailProductReq req);

    /**
     * 根据条件获取出运明细产品已开票数量
     * @param code 出运明细发票号
     * @param contractCode 外销合同号
     * @param productCode 产品编码
     * @param specCode 规格编码
     * @return
     */
    Integer findCarryDetailProductQuantity(@Param("sourceType")Integer sourceType,
                                           @Param("code") String code,
                                           @Param("contractCode") String contractCode,
                                           @Param("productCode") String productCode,
                                           @Param("specCode") String specCode);

}
